﻿# -*- coding: utf-8 -*-
#!/usr/bin/python

#------------------------------------------------------------------------

## @package     primitives
## \brief   	affichage des primitives opengl
## \author  	Eric Maisel
## \note    	edité par Pierrick Troadec et Kawtar Hssain
## \date        28/12/2011
## \version     1.2
## \copyright   licence BSD

#------------------------------------------------------------------------

#    Importations
#  -----------------

import pyglet
from pyglet.gl import *

#   Fonctions
#  -----------------

## Charge les texture
##@param nom       : nom du fichier à charger
##@return texture  : texture utilisable par le module opengl de pyglet
def chargerTexture(nom):
    image = pyglet.image.load(nom)
    print "Texture ", nom, " chargee"
        
    texture = image.get_texture()
    
    glBindTexture(GL_TEXTURE_2D,texture.id)
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR)
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)

    return texture

## Affiche un rectangle
##@param position    : position du rectangle à afficher dans l'espace
##@param angle       : orientation du rectangle
##@param dimensions  : longueur et largeur du rectangle
##@param texture     : texture à appliquer sur le rectangle
##@param couleur     : couleur à appliquer sur le rectangle en ca d'absence de texture
##@param rep         : repetion de la texture sur le rectangle
def afficherRectangle(position=(0.0,0.0,0.0),angle=0.0,dimensions=(1.0,1.0),texture=None,couleur=(1.0,0.0,0.0), rep = 1.0):
    x,y,z = position
    largeur, hauteur  = dimensions

    if texture == None:
        r,v,b = couleur
        glColor3f(r,v,b)
        glDisable(GL_TEXTURE_2D)
        glColor3f(1.0,0.0,0.0)
        glPushMatrix()
        glTranslatef(x,y,z)
        glRotatef(angle,0.0,1.0,0.0)
        glScalef(largeur,hauteur,1.0)
        glBegin(GL_QUADS)
        glVertex3f(-0.5,0.0,0.0)
        glVertex3f(0.5,0.0,0.0)
        glVertex3f(0.5,1.0,0.0)
        glVertex3f(-0.5,1.0,0.0)
        glEnd()
        glPopMatrix()
        glEnable(GL_TEXTURE_2D)
    else:
        glBindTexture(GL_TEXTURE_2D,texture.id)
        glPushMatrix()
        glTranslatef(x,y,z)
        glRotatef(angle,0.0,1.0,0.0)
        glScalef(largeur,hauteur,1.0)
        glBegin(GL_QUADS)
        glTexCoord2f(0.0,0.0)
        glVertex3f(-0.5,0.0,0.0)
        glTexCoord2f(rep,0.0)
        glVertex3f(0.5,0.0,0.0)
        glTexCoord2f(rep,rep)
        glVertex3f(0.5,1.0,0.0)
        glTexCoord2f(0.0,rep)
        glVertex3f(-0.5,1.0,0.0)
        glEnd()
        glPopMatrix()



## Affiche un plafond
##@param position    : position du rectangle à afficher dans l'espace
##@param dimensions  : longueur et largeur du rectangle
##@param texture     : texture a appliquer sur le rectangle
##@param couleur     : couleur a appliquer sur le rectangle en ca d'absence de texture
##@param rep         : répétion de la texture sur le rectangle
def afficherPlafond(position=(0.0,0.0,0.0),dimensions=(1.0,1.0),texture=None, couleur=(1.0,1.0,1.0), rep = 1):
    x,y,z= position
    l,p   = dimensions
    l,p = l/2.0,p/2.0
    if texture==None:
        glDisable(GL_TEXTURE_2D)
        r,v,b = couleur
        glColor3f(r,v,b)
        glBegin(GL_QUADS)
        glVertex3f(x+l,y,z+p)
        glVertex3f(x+l,y,z-p)
        glVertex3f(x-l,y,z-p)
        glVertex3f(x-l,y,z+p)
        glEnd()
        glEnable(GL_TEXTURE_2D)
    else:
        glBindTexture(GL_TEXTURE_2D,texture.id)
        glBegin(GL_QUADS)
        glTexCoord2f(0.0,0.0)
        glVertex3f(x+l,y,z+p)
        glTexCoord2f(rep,0.0)
        glVertex3f(x+l,y,z-p)
        glTexCoord2f(rep,rep)
        glVertex3f(x-l,y,z-p)
        glTexCoord2f(0.0,rep)
        glVertex3f(x-l,y,z+p)
        glEnd()


## Affiche une image dans une projection 2D
##@param position    : position du rectangle à afficher dans l'espace
##@param dimension   : longueur et largeur du rectangle
##@param texture     : texture à appliquer sur le rectangle
##@param couleur     : couleur à appliquer sur le rectangle en ca d'absence de texture
##@param rep         : repetion de la texture sur le rectangle
def afficherImage(position=(0,0,0), dimension = (1,1), texture = None, couleur=(1.0,1.0,1.0), rep=1):
    x,y,z = position
    largeur, hauteur  = dimension

    if texture == None:
        r,v,b = couleur
        glColor3f(r,v,b)
        glDisable(GL_TEXTURE_2D)
        glColor3f(1.0,0.0,0.0)
        glPushMatrix()
        glTranslatef(x,y,z)
        glRotatef(angle,0.0,1.0,0.0)
        glScalef(largeur,hauteur,1.0)
        glBegin(GL_QUADS)
        glVertex2f(0.0,0.0)
        glVertex2f(1.0,0.0)
        glVertex2f(1.0,1.0)
        glVertex2f(0.0,1.0)
        glEnd()
        glPopMatrix()
        glEnable(GL_TEXTURE_2D)
    else:
        glBindTexture(GL_TEXTURE_2D,texture.id)
        glPushMatrix()
        glTranslatef(x,y,z)
        glScalef(largeur,hauteur,1.0)
        glBegin(GL_QUADS)
        glTexCoord2f(0.0,0.0)
        glVertex2f(0.0,0.0)
        glTexCoord2f(rep,0.0)
        glVertex2f(1.0,0.0)
        glTexCoord2f(rep,rep)
        glVertex2f(1.0,1.0)
        glTexCoord2f(0.0,rep)
        glVertex2f(0.0,1.0)
        glEnd()
        glPopMatrix()
    
